{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8bcd1a3d-7c50-4f58-be4e-1ed654aa33be",
   "metadata": {},
   "source": [
    "# Chat Executor: with function calling\n",
    "\n",
    "This notebook walks through an example creating a chat executor that uses function calling.\n",
    "This is useful for getting started quickly.\n",
    "However, it is highly likely you will want to customize the logic - for information on that, check out the other examples in this folder."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e130cf70-a30e-47d7-8fd5-464f1a92e374",
   "metadata": {},
   "source": [
    "## Set up the chat model and tools\n",
    "\n",
    "Here we will define the chat model and tools that we want to use.\n",
    "Importantly, this model MUST support OpenAI function calling."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "efb7e3c0-c63f-40f6-93ce-19681d650fc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_community.tools.tavily_search import TavilySearchResults\n",
    "from langgraph.prebuilt import chat_agent_executor\n",
    "from langchain_core.messages import HumanMessage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a7025f33-3160-41cf-868b-17ebc916fb1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "tools = [TavilySearchResults(max_results=1)]\n",
    "model = ChatOpenAI()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43064805-2ac9-4b5a-850c-a68dd7282350",
   "metadata": {},
   "source": [
    "## Create executor\n",
    "\n",
    "We can now use the high level interface to create the executor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "32b4ae66-f667-4a8b-a602-503fd0effcd9",
   "metadata": {},
   "outputs": [],
   "source": [
    "app = chat_agent_executor.create_function_calling_executor(model, tools)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d63dbfc7-a5c1-4a03-991c-f0789ba52c52",
   "metadata": {},
   "source": [
    "We can now invoke this executor. The input to this must be a dictionary with a single `messsages` key that contains a list of messages."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0abc5655-d772-450c-832f-1fee1111a5f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'messages': [AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\\n  \"query\": \"weather in San Francisco\"\\n}', 'name': 'tavily_search_results_json'}})]}\n",
      "----\n",
      "{'messages': [FunctionMessage(content=\"[{'url': 'https://weatherspark.com/h/m/557/2024/1/Historical-Weather-in-January-2024-in-San-Francisco-California-United-States', 'content': 'January 2024 Weather History in San Francisco California, United States  Daily Precipitation in January 2024 in San Francisco Observed Weather in January 2024 in San Francisco  San Francisco Temperature History January 2024 Hourly Temperature in January 2024 in San Francisco  Hours of Daylight and Twilight in January 2024 in San FranciscoThis report shows the past weather for San Francisco, providing a weather history for January 2024. It features all historical weather data series we have available, including the San Francisco temperature history for January 2024. You can drill down from year to month and even day level reports by clicking on the graphs.'}]\", name='tavily_search_results_json')]}\n",
      "----\n",
      "{'messages': [AIMessage(content=\"I couldn't find the current weather in San Francisco. However, you can check historical weather data for January 2024 [here](https://weatherspark.com/h/m/557/2024/1/Historical-Weather-in-January-2024-in-San-Francisco-California-United-States).\")]}\n",
      "----\n",
      "{'messages': [HumanMessage(content='what is the weather in sf'), AIMessage(content='', additional_kwargs={'function_call': {'arguments': '{\\n  \"query\": \"weather in San Francisco\"\\n}', 'name': 'tavily_search_results_json'}}), FunctionMessage(content=\"[{'url': 'https://weatherspark.com/h/m/557/2024/1/Historical-Weather-in-January-2024-in-San-Francisco-California-United-States', 'content': 'January 2024 Weather History in San Francisco California, United States  Daily Precipitation in January 2024 in San Francisco Observed Weather in January 2024 in San Francisco  San Francisco Temperature History January 2024 Hourly Temperature in January 2024 in San Francisco  Hours of Daylight and Twilight in January 2024 in San FranciscoThis report shows the past weather for San Francisco, providing a weather history for January 2024. It features all historical weather data series we have available, including the San Francisco temperature history for January 2024. You can drill down from year to month and even day level reports by clicking on the graphs.'}]\", name='tavily_search_results_json'), AIMessage(content=\"I couldn't find the current weather in San Francisco. However, you can check historical weather data for January 2024 [here](https://weatherspark.com/h/m/557/2024/1/Historical-Weather-in-January-2024-in-San-Francisco-California-United-States).\")]}\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "inputs = {\"messages\": [HumanMessage(content=\"what is the weather in sf\")]}\n",
    "for s in app.stream(inputs):\n",
    "    print(list(s.values())[0])\n",
    "    print(\"----\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "87f147e3-f96f-4b96-a3cc-ec7affd7a57f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
